
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>

void change_arr(int * arr, int len)
{
    for (int i = 0; i < len; i++) {
        arr[i] += 8;
    }
}

void copy_arr(int * dest, int * src, int len)
{
    for (int i = 0; i < len; i++) {
        dest[i] = src[i];
    }
}

void show_arr(int * arr, int len)
{
    printf("array: ");
    for (int i = 0; i < len; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

int main(void) {
    int x[4] = {0};
    int y[4] = {0};
    omp_set_num_threads(52);
    #pragma omp parallel
    #pragma omp single
    for (int i = 0; i < 4000; i++)
    {
        #pragma omp task untied depend(inout : x[:4])
        change_arr(x, 4);
        #pragma omp task untied depend(in: x[:4]) depend(out: y[:4])
        {
            //sleep(1);
            copy_arr(y, x, 4);
        }
        /*
        #pragma omp task depend(in: x[:4], y[:4])
        {
            show_arr(x, 4);
            show_arr(y, 4);
        }
        */
        //#pragma omp taskwait
    }
    #pragma omp taskwait
    show_arr(x, 4);
    show_arr(y, 4);
    return 0;
}